package com.ipay.wechat.util;

import com.ipay.utils.Constant;
import com.ipay.utils.StringUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 工具类
 *
 * @author zhenliu
 * @version 1.0 2017-09-08
 */
public class Utils {
    /**
     * 日志记录
     */
    private static Logger logger = LoggerFactory.getLogger(Utils.class);

    /**
     * * 强制压缩/放大图片到固定的大小
     * @param filePath 原图地址
     * @param imgSize  图片尺寸       100x100
     * @param realPath 项目地址   主要是获取默认图片处理
     * @return retufilePath
     * @throws IOException
     */
    public String resize(String filePath, String imgSize, String realPath) {
        String retufilePath = realPath + Constant.DEFAULT_PNG;
        try {
            ///判断文件是否存在
            File file = new File(filePath);
            if (file.exists()) {
                Image image = ImageIO.read(file);
                if (image != null && StringUtil.isNotEmpty(imgSize)) {   //////是否为图片，压缩图片大小不能为空
                    imgSize = imgSize.replaceAll("\\s*", "").toLowerCase();//去除参数值中的空格  大写转小写
                    String suffix = StringUtils.substring(filePath, filePath.lastIndexOf("."));//jpd;png,jpg
                    String suffilName = StringUtils.substring(filePath, 0, filePath.lastIndexOf("."));//E:\ojdbc6.png里的E:\ojdbc6
                    String filePathSize = suffilName + imgSize + suffix;////压缩后图片地址
                    logger.debug(suffilName + "    " + suffix+"  =  "+filePathSize);
                    ///判断图片是否存在
                    File fileSize = new File(filePathSize);
                    if (fileSize.exists()) {
                        retufilePath = filePathSize;
                    } else {
                        String wStr = imgSize.substring(0, imgSize.indexOf("x"));
                        String hStr = imgSize.substring(imgSize.indexOf("x") + 1);
                        if (StringUtil.isNotEmpty(wStr) && StringUtil.isNotEmpty(hStr)) {
                            int w = Integer.parseInt(wStr);
                            int h = Integer.parseInt(hStr);
                            this.resize(filePath, w, h, filePathSize);///创建图片
                            retufilePath = filePathSize;
                        }
                    }
                }
            }
        } catch (IOException ex) {
            logger.error(ex.getMessage(), ex);
        }
        return retufilePath;
    }
    /**
     * * 强制压缩/放大图片到固定的大小
     * @param fileName   原图地址
     * @param w          int 新宽度
     * @param h          int 新高度
     * @param outFileUrl 压缩后图片地址
     * @throws IOException Exception
     */
    public void resize(String fileName, int w, int h, String outFileUrl) throws IOException {
        File file = new File(fileName);// 读入文件
        Image imgFile = ImageIO.read(file);      // 构造Image对象
        // SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
        logger.debug("w:" + w + "===h:" + h);
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        image.getGraphics().drawImage(imgFile, 0, 0, w, h, null); // 绘制缩小后的图
        String formatName = outFileUrl.substring(outFileUrl.lastIndexOf(".") + 1);
        ImageIO.write(image, /*"GIF"*/ formatName /* format desired */, new File(outFileUrl) /* target */);
    }


    /**
     * look
     * @param filePath String
     * @param response HttpServletResponse
     */
    public static void look(String filePath, HttpServletResponse response) {
        if (filePath == null || "".equals(filePath)) {
            return;
        }
        FileInputStream is=null;
        try {
            File filePic = new File(filePath);
            if (filePic.exists()) {
                is = new FileInputStream(filePic);
                int i = is.available(); // 得到文件大小
                byte[] data = new byte[i];
                is.read(data); // 读数据
                is.close();
                response.setContentType("image/*"); // 设置返回的文件类型
                OutputStream toClient = response.getOutputStream(); // 得到向客户端输出二进制数据的对象
                toClient.write(data); // 输出数据
                toClient.close();
            }
        } catch (FileNotFoundException e) {
            logger.error(e.getMessage(), e);
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }finally {
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 提供精确的小数位四舍五入处理。
     * @param bdvalue 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static BigDecimal round(BigDecimal bdvalue, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal one = new BigDecimal("1");
        return bdvalue.divide(one, scale, BigDecimal.ROUND_HALF_UP);
    }
    /*
        * 将时间戳转换为时间
        */
    public static String stampToDate(String s){
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long lt = Long.parseLong(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }

}
